/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.unifor.ia;

import java.util.Random;

/**
 * Classe a ser implementada para o 'pensamento' do agente.
 * @author pedro
 */
public class SimpleAgent extends Agente {

    /**
     * Contador de passos dados
     */
    private int contador = 0;
    /**
     * Representação para o fim de uma sequencia de passos.
     */
    private boolean chegou;
    /**
     * Direção auxiliar. 
     */
    private int direcaoAux;
    /**
     * Quantidade de passos a serem dados.
     */
    private int passos = 10;
    /**
     * Irá receber um valor randômico.
     */
    private int sort;
    /**
     * Quando chega na área de brilho de ouro essa variável ganha valor true.
     */
    private boolean proximoDoOuro;

    @Override
    protected void acao() {        
        // Se o sensor indicar fedor ou brisa, voltar para a posição anterior.
        if (getSensor() == Ambiente.SIMB_FEDOR_WUMPUS || getSensor() == Ambiente.SIMB_BRISA_BURACO) {
            voltar();
            if(getSensor() == Ambiente.SIMB_FEDOR_WUMPUS)
                setSoltouFlecha(true);
        } // Se o sensor indicar brilho do ouro, desconfie que o ouro está por perto.
        else if (getSensor() == Ambiente.SIMB_BRILHO_OURO) {
            proximoDoOuro = true;
            setDirecao(new Random().nextInt(4));
        } // Se o ouro for encontrado avisa ao agente.
        else if (getSensor() == Ambiente.SIMB_OURO) {
            proximoDoOuro = false;
        } else {
            // Se o agente tiver perto do ouro e se afastar, volta pra dentro da área de proximidade do ouro.
            if (proximoDoOuro == true) {
                voltar();
            } else {
                // Lógica dos passos.
                if (contador <= passos) {
                    contador++;
                    if (contador == passos) {
                        contador = 0;
                        chegou = true;
                    }
                    if (chegou) {
                        direcaoAux = getDirecao();
                        // Tendência a rodar em circulos, caso não encontre barreiras.
                        // Obs: Tentei randomizar mais o andar mas os resultados não foram bons.
                        switch (direcaoAux) {
                            case Agente.AGENT_DOWN:
                                setDirecao(Agente.AGENT_LEFT);
                                break;
                            case Agente.AGENT_UP:
                                setDirecao(Agente.AGENT_RIGHT);
                                break;
                            case Agente.AGENT_LEFT:
                                setDirecao(Agente.AGENT_UP);
                                break;
                            case Agente.AGENT_RIGHT:
                                setDirecao(Agente.AGENT_DOWN);
                                break;
                        }
                        // Se o agente achou o ouro aumentar a quantidade de passos para que o agente procure
                        // (Aumentar o diâmetro do circulo)
                        // andar pelas laterais já que a entrada fica em uma lateral.
                        if (isAchouOuro()) {
                            passos = 40;                            
                        } else {
                            // Se o ouro não foi achado, incrementar ou decrementar a quantidade de passos
                            // para que o personagem não fique repetindo o mesmo percurso.
                            sort = new Random().nextInt(2);
                            if (sort == 0) {
                                passos += 1;
                            } else {
                                passos -= 1;
                            }
                            if (passos <= 0) {
                                passos = 2;
                            } else if (passos >= 5) {
                                passos = 4;
                            }

                        }
                        chegou = false;
                    }

                }
            }
        }

    }
}
